<?php

namespace App\Util;

class FileUtil
{
    /**
     * 创建目录
     * @param $dir string 目录
     *
     * @return bool
     * @author Chris Yu <chrisyu@crabapple.top> 2023/3/21
     */
    public static function createFolders($dir)
    {
        return is_dir($dir) or (self::createFolders(dirname($dir)) and mkdir($dir, 0755));
    }

    /**
     * 格式化文件大小
     * @param $size
     *
     * @return string
     * @author Chris Yu <chrisyu@crabapple.top> 2023/5/23
     */
    public static function formatSize($size) {
        $units = array('B', 'KB', 'MB', 'GB', 'TB');
        $i = 0;
        while ($size >= 1024 && $i < 4) {
            $size /= 1024;
            $i++;
        }
        return round($size, 2) . ' ' . $units[$i];
    }

    /**
     * 格式化文件大小
     * @param $size
     *
     * @return string
     * @author Chris Yu <chrisyu@crabapple.top> 2023/5/23
     */
    public static function formatSizeFromKb($size) {
        $units = array('KB', 'MB', 'GB', 'TB');
        $i = 0;
        while ($size >= 1024 && $i < 4) {
            $size /= 1024;
            $i++;
        }
        return round($size, 2) . ' ' . $units[$i];
    }

    public static function getMimeType($file)
    {
        // 使用 mime_content_type() 函数获取文件的 MIME 类型
        return mime_content_type($file);
    }

    /**
     * 统计目录大小
     * @param $dir
     *
     * @return false|int
     * @author Chris Yu <chrisyu@crabapple.top> 2023/5/29
     */
    public static function getDirectorySize($dir)
    {
        $size = 0;
        $files = scandir($dir);
        foreach ($files as $file) {
            if ($file == '.' || $file == '..') {
                continue;
            }
            $path = $dir . '/' . $file;
            if (is_file($path)) {
                $size += filesize($path);
            }
            else if (is_dir($path)) {
                $size += self::getDirectorySize($path);
            }
        }
        return $size;
    }

    /**
     * 获取在指定目录中，以某关键词为前缀的文件的数量
     * @param $dir string 目录
     * @param $prefix string 关键词
     *
     * @author Chris Yu <chrisyu@crabapple.top> 2023/6/28
     */
    public static function countInDirByKeywords($dir, $prefix)
    {
        $files = scandir($dir);

        // 计数器
        $count = 0;

        // 遍历文件列表
        foreach ($files as $file) {
            if ($file === '.' || $file === '..') {
                continue;
            }
            // 检查文件名是否以指定前缀开头
            if (strpos($file, $prefix) === 0) {
                $count++;
            }
        }
        return $count;
    }

    /**
     * 获取最新创建的文件
     * @author Chris Yu <chrisyu@crabapple.top> 2023/6/29
     */
    public static function getLastCreateTimeFilePath($absoluteFilePathList)
    {
        $lastCreateTime = null;
        $lastCreatedFilepath = '';
        foreach ($absoluteFilePathList as $file) {
            $filectime = filectime($file);
            if (empty($lastCreateTime) || $filectime > $lastCreateTime) {
                $lastCreateTime = $filectime;
                $lastCreatedFilepath = $file;
            }
        }
        return $lastCreatedFilepath;
    }

    /**
     * 查询子目录根据关键词(不轮循)
     * @param $keywords
     *
     * @author Chris Yu <chrisyu@crabapple.top> 2023/8/24
     */
    public static function getSubDirListByKeywords($dir, $keywords, $isAbsolutePath = true)
    {
        $subDirList = [];
        $items = scandir($dir);

        foreach ($items as $item) {
            if ($item !== '.' && $item !== '..') {
                $path = $dir . '/' . $item;

                if (is_dir($path)) {
                    if (strpos($item, $keywords) !== false) {
                        $subDirList[] = $isAbsolutePath ? $path : $item;
                    }
                }
            }
        }

        return $subDirList;
    }

    /**
     * 裁剪图片
     *
     * @param $filePath string 图片路径
     * @param $croppedFilePath string 裁剪后保存的图片路径
     * @param $options array
     *
     * @author Chris Yu <chrisyu@crabapple.top> 2024/1/16
     */
    public static function cropImage($filePath, $croppedFilePath, $options = [])
    {
        // 裁剪
        $height = $options['height'] ?? 750;
        $width = $options['width'] ?? 750;
        $imageInfo = getimagesize($filePath);
        switch ($imageInfo['mime']) {
            case 'image/png':
                // 处理 PNG 文件
                $image = imagecreatefrompng($filePath);
                break;
            case 'image/jpeg':
                // 处理 JPEG 文件
                $image = imagecreatefromjpeg($filePath);
                break;
            case 'image/gif':
                // 处理 GIF 文件
                $image = imagecreatefromgif($filePath);
                break;
        }
        $originalWidth = imagesx($image);
        $originalHeight = imagesy($image);
        $croppedImage = imagecreatetruecolor($width, $height);
        imagecopyresampled($croppedImage, $image, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);
        imagejpeg($croppedImage, $croppedFilePath);
        imagedestroy($image);
        imagedestroy($croppedImage);

        return true;
    }
}
